package eval;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.HashMap;

public class EvalRes {

	public static void main (String[] args) {
		String basePath = "/home/luong/workspace/search-insa-project/SearchEngine/";
		String numPadding = "";
		int pert5 = 0, pert10 = 0, pert25 = 0;
		HashMap<String,Integer> refMap = new HashMap<String,Integer>();
		
		for (int i=1; i<=2; i++){  // pour chacun des 11 documents
			try {
				// local variables
				int cptTot=0; // compteur de resultats
				int cptPert=0; // compteru de resultats pertinents
				int cptRappelRef=0; // compteur de r�sultats pertinants attendus
				int index; // index - utilis� pour toutes les op�rations sur les String
				String line; // ligne extraite d'un document
				String docName; // le nom du document charge
				String xpath; // et son xPath
				Character c; // un character pour les tests de comparaison
				
				// le padding pour rajouter un zero en dessous de 10 : qrel04, qrel11
				if (i >= 10) {
					numPadding = "";
				} else {
					numPadding = "0";
				}
				
				// remplissage de la map de reference
				FileReader fComp = new FileReader(basePath+"qrels/qrels/qrel"+numPadding + i + ".txt");
				BufferedReader brComp = new BufferedReader(fComp);
				// on boucle pour chaque ligne
				while ((line = brComp.readLine()) != null) {
					// on v�rifie que la ligne n'est pas vide (pour �viter un IndexOutOfRange)
					index = line.length();
					if (index > 0){
						c = line.charAt(index-1); // d�tection du chiffre de fin de ligne
						line = line.substring(0,index-2); // ligne qui servira d'index pourla HashMap
						if (c.compareTo('1')==0){ // si on a un 1 en fin de ligne (resultat pertinent, alors on rajoute 1
							refMap.put(line, 1);
							cptRappelRef++;
						} else {
							refMap.put(line, 0);
						}
					}
				}
				brComp.close();
								
				FileReader fRes = new FileReader(basePath+"result"+i+".txt");
				BufferedReader brRes = new BufferedReader(fRes);
				// lecture des r�sultats obtenus
				// pour chacune des 25 premi�res lignes
				while ((line = brRes.readLine()) != null) {
					cptTot++; // incr�mentation du compteur de lignes
					line = line.substring(2); // suppression des 2 premiers caract�res d'espaces
					index = line.indexOf(".xml");
					if (index != -1){
						docName = line.substring(index - 15, index+4); // determination du nom du doc
						xpath = line.substring(index + 4); // xpath dans le document
						xpath = docName + "\t" + xpath; // formatage pour la recherche dans le document de referecne
						if (refMap.get(xpath)==1) { // si le paragraphe a �t� consid�r� pertinent dans les doc de r�f�rence
							cptPert++; // incr�mentation du compteur de pertinence
						}
						switch (cptTot) { // si on est � un point de v�rification (pertinence � 5, 10 ou 25)
							case 5:
								pert5 = cptPert;
								break;
							case 10 :
								pert10 = cptPert;
								break;
							case 25 : 
								pert25 = cptPert;
								break;
							default : break;
						}
					}
				}
				brRes.close();
				if(cptTot < 5) { // dans le cas ou moins de 5 lignes ont �t� trouv�es
					pert5 = cptPert;
					pert10 = cptPert;
					pert25 = cptPert;
				} else if (cptTot < 10) { // dans le cas ou moins de 10 lignes ont �t� trouv�es
					pert10 = cptPert;
					pert25 = cptPert;
				} else if (cptTot < 25) { // dans le cas ou moins de 25 lignes ont �t� trouv�es
					pert25 = cptPert;
				}
				float pourcent5, pourcent10, pourcent25,pourcentRappel;
				pourcent5 = ((float)pert5 )/ 5;
				pourcent10 = ((float)pert10 )/ 10;
				pourcent25 = ((float)pert25 )/ 25;
				pourcentRappel = ((float)cptPert )/ (float)cptRappelRef;
				// Affichage des r�sultats
				System.out.println("Requete "+i);
				System.out.println("  Precision a 5 : "+pert5+" soit "+pourcent5+"%");
				System.out.println("  Precision a 10 : "+pert10+" soit "+pourcent10+"%");
				System.out.println("  Precision a 25 : "+pert25+" soit "+pourcent25+"%");	
				System.out.println("  Rappel : "+cptPert+" documents sur "+cptRappelRef+", soit "+pourcentRappel+"%");
				// Nettoyage de la map de r�f�rence pour le document suivant
				refMap.clear();	
				// Nettoyage des r�sultats
				pert5 = 0; pert10 = 0; pert25 = 0;
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}
